package com.my.learn.thread.executor;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.my.learn.thread.MyCallable;
import com.my.learn.thread.TestThread;

import java.util.concurrent.*;

public class ThreadPoolExecutorTest {

    /**
     * 自定义线程名称,方便的出错的时候溯源
     */
    private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("ThreadPoolExecutorTest-%d").build();

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //不安全
//        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

        //安全
        ExecutorService executorService = new ThreadPoolExecutor(1, 4, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
        executorService.execute(new TestThread(1));
        Future future = executorService.submit(new MyCallable(1));
        System.out.println(future.get());
        /**
         *   1.当创建线程池后，初始时，线程池处于RUNNING状态，此时线程池中的任务为0；
         *
         * 　2.如果调用了shutdown()方法，则线程池处于SHUTDOWN状态，此时线程池不能够接受新的任务，它会等待所有任务执行完毕；
         *
         * 　3.如果调用了shutdownNow()方法，则线程池处于STOP状态，此时线程池不能接受新的任务，并且会去尝试终止正在执行的任务；
         *
         *    4.当所有的任务已终止，ctl记录的”任务数量”为0，线程池会变为TIDYING状态。接着会执行terminated()函数。
         *
         * 　5.线程池处在TIDYING状态时，执行完terminated()之后，就会由 TIDYING -> TERMINATED，线程池被设置为TERMINATED状态。
         */
        executorService.shutdown();
//        executorService.shutdownNow();
    }
}
